<?php
//   +----------------------------------------------------------------------
//   | Copyright (c) 2015-2025 http://www.hdphp.cn All rights reserved.
//   | Licensed ( http://www.hdphp.cn/licenses/ )
//   | Author: Jack <sophia2152@qq.com>
//   | 官方网址: http://www.hdphp.cn
//   | 这不是一个自由软件！您只能在不用于商业目的的前提下对程序代码进行修改和使用。
//   | 任何企业和个人不允许对程序代码以任何形式任何目的再发布。
//   +----------------------------------------------------------------------

use think\facade\Log;

// +----------------------------------------------------------------------
// | 核心函数库，该函数全站调用
// +----------------------------------------------------------------------
if (!function_exists('p')) {
    /**
     * 注释：打印函数
     * 创建人：Jack
     * 创建时间：2023/7/26 17:25
     * @param $arr
     * @return void
     */
    function p($arr)
    {
        echo '<pre>' . print_r($arr, true) . '</pre>';
    }
}

if (!function_exists('check_username')) {
    /**
     * 注释：检查用户名是否合规
     * 创建人：Jack
     * 创建时间：2023/7/30 9:38
     * @param string $username 要检查的用户名
     * @return bool
     */
    function check_username(string $username)
    {
        $strlen = strlen($username);
        if ($strlen < 4 || $strlen > 64) {
            return false;
        } else if (!preg_match("/^[a-z0-9\x7f-\xff][a-z0-9_\x7f-\xff]*[a-z0-9\x7f-\xff]$/i", $username)) {
            return false;
        }
        return true;
    }
}

if (!function_exists('check_phone')) {
    /**
     * 注释：检查是否是手机号码 仅验证格式是否准确，不能验证是否真实存在
     * 创建人：Jack
     * 创建时间：2023/7/30 9:27
     * @param string $phone 手机号码
     * @return bool
     */
    function check_phone(string $phone)
    {
        return strlen($phone) == 11 && preg_match("/^1[3456789]\d{9}$/", $phone);
    }
}

if (!function_exists('check_mail')) {
    /**
     * 注释：邮箱验证
     * 创建人：Jack
     * 创建时间：2023/7/30 9:37
     * @param string $mail
     * @return bool
     */
    function check_mail(string $mail)
    {
        if (filter_var($mail, FILTER_VALIDATE_EMAIL)) {
            return true;
        } else {
            return false;
        }
    }
}

if (!function_exists('random_string')) {
    /**
     * 注释：生成随机字符串
     * 创建人：Jack
     * 创建时间：2023/7/30 9:18
     * @param string $type type of random string.  basic, md5, sha1, diy
     * @param int    $len  number of characters
     * @param string $string
     * @return int|string|void
     */
    function random_string(string $type = 'basic', int $len = 8, string $string = '0123456789')
    {
        if ($type == 'basic') {
            return mt_rand();
        } else if ($type == 'md5') {
            return md5(uniqid(mt_rand()));
        } else if ($type == 'sha1') {
            return sha1(uniqid(mt_rand(), TRUE));
        } else if ($type == 'diy') {
            return substr(str_shuffle(str_repeat($string, ceil($len / strlen($string)))), 0, $len);
        }
    }
}

if (!function_exists('sys_config')) {
    /**
     * 注释：获取系统单个配置
     * 创建人：Jack
     * 创建时间：2024/1/11 15:55
     * @param string $name
     * @param        $default
     * @return array|mixed|object|string
     */
    function sys_config(string $name, $default = '')
    {
        if (empty($name)) {
            return $default;
        }
        $sysConfig = app('sysConfig')->get($name);
        if (is_array($sysConfig)) {
            foreach ($sysConfig as &$item) {
                if (strpos($item, '/uploadfile/system/') !== false || strpos($item, '/res/system_images/') !== false) $item = set_file_url($item);
            }
        } else {
            if (strpos($sysConfig, '/uploadfile/system/') !== false || strpos($sysConfig, '/res/system_images/') !== false) $sysConfig = set_file_url($sysConfig);
        }
        $config = is_array($sysConfig) ? $sysConfig : trim($sysConfig);
        if ($config === '' || $config === false) {
            return $default;
        } else {
            return $config;
        }
    }
}

if (!function_exists('set_file_url')) {
    /**
     * 注释：设置附加路径
     * 创建人：Jack
     * 创建时间：2024/1/11 15:58
     * @param $image
     * @param $siteUrl
     * @return mixed|string
     */
    function set_file_url($image, $siteUrl = '')
    {
        if (!strlen(trim($siteUrl))) $siteUrl = sys_config('site_url');
        if (!$image) return $image;
        if (is_array($image)) {
            foreach ($image as &$item) {
                $domainTop1 = substr($item, 0, 4);
                $domainTop2 = substr($item, 0, 2);
                if ($domainTop1 != 'http' && $domainTop2 != '//') {
                    $item = $siteUrl . str_replace('\\', '/', $item);
                }
            }
        } else {
            $domainTop1 = substr($image, 0, 4);
            $domainTop2 = substr($image, 0, 2);
            if ($domainTop1 != 'http' && $domainTop2 != '//') {
                $image = $siteUrl . str_replace('\\', '/', $image);
            }
        }
        return $image;
    }
}

if (!function_exists('make_path')) {
    /**
     * 注释：上传路径转化,默认路径
     * 创建人：Jack
     * 创建时间：2024/1/30 16:59
     * @param      $path
     * @param int  $type
     * @param bool $force
     * @return string
     * @throws \Exception
     */
    function make_path($path, int $type = 2, bool $force = false)
    {
        $path = DS . ltrim(rtrim($path));
        switch ($type) {
            case 1:
                $path .= DS . date('Y');
                break;
            case 2:
                $path .= DS . date('Y') . DS . date('m');
                break;
            case 3:
                $path .= DS . date('Y') . DS . date('m') . DS . date('d');
                break;
        }
        try {
            if (is_dir(app()->getRootPath() . 'public' . DS . 'uploadfile' . $path) || mkdir(app()->getRootPath() . 'public' . DS . 'uploadfile' . $path, 0777, true)) {
                return trim(str_replace(DS, '/', $path), '.');
            } else {
                return '';
            }
        } catch (\Exception $e) {
            if ($force) throw new \Exception($e->getMessage());
            return '无法创建文件夹，请检查您的上传目录权限：' . app()->getRootPath() . 'public' . DS . 'uploadfile' . DS . 'attach' . DS;
        }
    }
}


if (!function_exists('get_tree_children')) {
    /**
     * 注释：tree 子菜单
     * 创建人：Jack
     * 创建时间：2024/1/24 9:59
     * @param array  $data         数据
     * @param string $childrenname 子数据名
     * @param string $keyName      数据key名
     * @param string $pidName      数据上级key名
     * @return array
     */
    function get_tree_children(array $data, string $childrenname = 'children', string $keyName = 'id', string $pidName = 'pid')
    {
        $list = [];
        foreach ($data as $value) {
            $list[$value[$keyName]] = $value;
        }
        $tree = []; // 格式化好的树
        foreach ($list as $item) {
            if (isset($list[$item[$pidName]])) {
                $list[$item[$pidName]][$childrenname][] = &$list[$item[$keyName]];
            } else {
                $tree[] = &$list[$item[$keyName]];
            }
        }
        return $tree;
    }
}

if (!function_exists('get_image_thumb')) {
    /**
     * 注释：获取缩略图
     * 创建人：Jack
     * 创建时间：2024/1/29 14:37
     * @param        $filePath
     * @param string $type all|big|mid|small
     * @param bool   $is_remote_down
     * @return array|mixed|string|string[]
     */
    function get_image_thumb($filePath, string $type = 'all', bool $is_remote_down = false)
    {
        if (!$filePath || !is_string($filePath) || strpos($filePath, '?') !== false) return $filePath;
        try {
            $arr = explode('.', $filePath);
            $ext_name = trim($arr[count($arr) - 1]);
            if (!in_array($ext_name, ['png', 'jpg', 'jpeg'])) {
                return $filePath;
            }
            $upload = UploadService::getOssInit($filePath, $is_remote_down);
            $data = $upload->thumb('', $type);
            $image = $type == 'all' ? $data : $data[$type] ?? $filePath;
        } catch (\Throwable $e) {
            $image = $filePath;
            \think\facade\Log::error('获取缩略图失败，原因：' . $e->getMessage() . '----' . $e->getFile() . '----' . $e->getLine() . '----' . $filePath);
        }
        $data = parse_url($image);
        if (!isset($data['host']) && (substr($image, 0, 2) == './' || substr($image, 0, 1) == '/')) {
            // 不是完整地址
            $image = sys_config('site_url') . $image;
        }
        // 请求是https 图片是http 需要改变图片地址
        if (strpos(request()->domain(), 'https:') !== false && strpos($image, 'https:') === false) {
            $image = str_replace('http:', 'https:', $image);
        }
        return $image;
    }
}

if (!function_exists('get_thumb_water')) {
    /**
     * 注释：处理数组获取缩略图、水印
     * 创建人：Jack
     * 创建时间：2024/1/29 14:36
     * @param                $list
     * @param string         $type
     * @param array|string[] $field 1、['image','images'] type 取值参数:type 2、['small'=>'image','mid'=>'images'] type 取field数组的key
     * @param bool           $is_remote_down
     * @return array|mixed|string|string[]
     */
    function get_thumb_water($list, string $type = 'small', array $field = ['image'], bool $is_remote_down = false)
    {
        if (!$list || !$field) return $list;
        $baseType = $type;
        $data = $list;
        if (is_string($list)) {
            $field = [$type => 'image'];
            $data = ['image' => $list];
        }
        if (is_array($data)) {
            foreach ($field as $type => $key) {
                if (is_integer($type)) { // 索引数组，默认type
                    $type = $baseType;
                }
                // 一维数组
                if (isset($data[$key])) {
                    if (is_array($data[$key])) {
                        $path_data = [];
                        foreach ($data[$key] as $k => $path) {
                            $path_data[] = get_image_thumb($path, $type, $is_remote_down);
                        }
                        $data[$key] = $path_data;
                    } else {
                        $data[$key] = get_image_thumb($data[$key], $type, $is_remote_down);
                    }
                } else {
                    foreach ($data as &$item) {
                        if (!isset($item[$key]))
                            continue;
                        if (is_array($item[$key])) {
                            $path_data = [];
                            foreach ($item[$key] as $k => $path) {
                                $path_data[] = get_image_thumb($path, $type, $is_remote_down);
                            }
                            $item[$key] = $path_data;
                        } else {
                            $item[$key] = get_image_thumb($item[$key], $type, $is_remote_down);
                        }
                    }
                }
            }
        }
        return is_string($list) ? ($data['image'] ?? '') : $data;
    }
}

if (!function_exists('getFileHeaders')) {
    /**
     * 注释：获取文件大小头部信息
     * 创建人：Jack
     * 创建时间：2024/1/29 14:34
     * @param string $url
     * @param        $isData
     * @return array
     */
    function getFileHeaders(string $url, $isData = true)
    {
        stream_context_set_default(['ssl' => ['verify_peer' => false, 'verify_peer_name' => false]]);
        $header['size'] = 0;
        $header['type'] = 'image/jpeg';
        if (!$isData) {
            return $header;
        }
        try {
            $headerArray = get_headers(str_replace('\\', '/', $url), true);
            if (!isset($headerArray['Content-Length'])) {
                $header['size'] = 0;
            } else {
                if (is_array($headerArray['Content-Length']) && count($headerArray['Content-Length']) == 2) {
                    $header['size'] = $headerArray['Content-Length'][1];
                } else {
                    $header['size'] = $headerArray['Content-Length'] ?? 0;
                }
            }
            if (!isset($headerArray['Content-Type'])) {
                $header['type'] = 'image/jpeg';
            } else {
                if (is_array($headerArray['Content-Type']) && count($headerArray['Content-Type']) == 2) {
                    $header['type'] = $headerArray['Content-Type'][1];
                } else {
                    $header['type'] = $headerArray['Content-Type'] ?? 'image/jpeg';
                }
            }
        } catch (\Exception $e) {
        }
        return $header;
    }
}

if (!function_exists('formatFileSize')) {
    /**
     * 注释：格式化文件大小
     * 创建人：Jack
     * 创建时间：2024/1/29 14:33
     * @param $size
     * @return string
     */
    function formatFileSize($size)
    {
        if (!$size) {
            return '0KB';
        }
        try {
            $toKb = 1024;
            $toMb = $toKb * 1024;
            $toGb = $toMb * 1024;
            if ($size >= $toGb) {
                return round($size / $toGb, 2) . 'GB';
            } else if ($size >= $toMb) {
                return round($size / $toMb, 2) . 'MB';
            } else if ($size >= $toKb) {
                return round($size / $toKb, 2) . 'KB';
            } else {
                return $size . 'B';
            }
        } catch (\Exception $e) {
            return '0KB';
        }
    }
}


if (!function_exists('msectime')) {
    /**
     * 注释：获取毫秒数
     * 创建人：Jack
     * 创建时间：2024/1/12 10:05
     * @return float
     */
    function msectime()
    {
        [$msec, $sec] = explode(' ', microtime());
        return (float)sprintf('%.0f', (floatval($msec) + floatval($sec)) * 1000);
    }
}

if (!function_exists('response_log_write')) {
    /**
     * 注释：日志写入
     * 创建人：Jack
     * 创建时间：2024/1/13 10:53
     * @param array  $data
     * @param string $type
     * @return void
     */
    function response_log_write(array $data, string $type = \think\Log::ERROR)
    {
        try {
            $id = 0;
            foreach (['adminId', 'uid', 'kefuId', 'supplierId'] as $value) {
                if (request()->hasMacro($value)) {
                    $id = request()->{$value}();
                }
            }
            // 日志内容
            $log = [
                $id,                                                                                     // 管理员ID
                request()->ip(),                                                                         // 客户ip
                ceil(msectime() - (request()->time(true) * 1000)),                                  // 耗时（毫秒）
                request()->method(true),                                                                 // 请求类型
                str_replace("/", "", request()->rootUrl()),                                // 应用
                request()->baseUrl(),                                                                    // 路由
                json_encode(request()->param(), JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES),  // 请求参数
                json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES),               // 报错数据
            ];
            Log::write(implode("|", $log), $type);
        } catch (\Throwable $e) {

        }
    }
}

if (!function_exists('get_version')) {
    /**
     * 注释：获取系统版本号
     * 创建人：Jack
     * 创建时间：2024/1/11 14:45
     * @param string $default
     * @return mixed|string
     */
    function get_version(string $default = 'v1.0.0')
    {
        try {
            $version = parse_ini_file(app()->getRootPath() . '.version');
            return $version['version'] ?? $default;
        } catch (\Throwable $e) {
            return $default;
        }
    }
}